package tp1.dao;
import com.mysql.jdbc.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import tp1.models.Cliente;
import tp1.DbConnection;
import tp1.models.Linha;
import tp1.models.Plano;

/**
 * Implementação DAO usando JDBC
 * @author tulio
 */
public class LinhaDao {

    private static final String mainSql = "SELECT LINHA.*, PLANO.*, CLIENTE.* FROM LINHA " +
            "INNER JOIN CLIENTE ON LINHA.CLIENTE = CLIENTE.CPF " +
            "INNER JOIN PLANO ON LINHA.PLANO = PLANO.CODIGO";

    public static int delete(String numero) throws SQLException {
        Statement stmt = (Statement) DbConnection.getInstance().createStatement();
        return stmt.executeUpdate("DELETE FROM LINHA WHERE NUMERO = '" + numero + "'");
    }

    public static Linha find(String numero) throws SQLException, Exception {
        String sql = mainSql + " WHERE LINHA.NUMERO  = '" + numero + "'";
        Statement stmt = (Statement) DbConnection.getInstance().createStatement();
        ResultSet rs = stmt.executeQuery(sql);
        while(rs.next()){
            return getLinhaByResultSet(rs, null);
        }
        
        return new Linha(numero);        
    }

    public static ArrayList<Linha> list() throws SQLException, Exception {
        Cliente c;
        Plano p;
        Linha l;
        
        ArrayList<Linha> list = new ArrayList();
        Statement stmt = (Statement) DbConnection.getInstance().createStatement();
        ResultSet rs = stmt.executeQuery(mainSql);
        while(rs.next()){
            list.add(getLinhaByResultSet(rs, null));
        }
        
        return list;
    }

    public static int insert(Linha linha) throws SQLException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String canc = "null";
        
        if(linha.getDataDeCancelamento() != null)
            canc = "'" + sdf.format(linha.getDataDeCancelamento()) + "'";

        String insert = "INSERT INTO LINHA (NUMERO, DATA_DE_ATIVACAO, DATA_DE_CANCELAMENTO, CLIENTE, PLANO, DIA_DE_PAGAMENTO) " +
            "VALUES('" + linha.getNumero() + "','" 
                + sdf.format(linha.getDataDeAtivacao()) + "',"
                + canc + ",'"
                + linha.getCliente().getCpf() + "','"
                + linha.getPlano().getCodigo() + "',"
                + linha.getDiaDePagamento() + ")";
        Statement stmt = (Statement) DbConnection.getInstance().createStatement();
        return stmt.executeUpdate(insert);
    }

    public static int update(Linha linha) throws SQLException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String canc = "null";
        
        if(linha.getDataDeCancelamento() != null)
            canc = "'" + sdf.format(linha.getDataDeCancelamento()) + "'";


        String update = "UPDATE LINHA SET DATA_DE_ATIVACAO = '" + sdf.format(linha.getDataDeAtivacao()) +
            "', DATA_DE_CANCELAMENTO = " + canc +
            ", CLIENTE = '" + linha.getCliente().getCpf() +
            "', PLANO = '" + linha.getPlano().getCodigo() +
            "', DIA_DE_PAGAMENTO = '" + linha.getDiaDePagamento() +
            "' WHERE NUMERO = '" + linha.getNumero() + "'";

        Statement stmt = (Statement) DbConnection.getInstance().createStatement();
        return stmt.executeUpdate(update);
    }

    public static int save(Linha linha) throws SQLException, Exception{
        int result;
        if(find(linha.getNumero()).getCliente() == null){
            result = insert(linha);
        } else {
            result = update(linha);
        }
        return result;
    }

    private static Linha getLinhaByResultSet(ResultSet rs, String alias) throws SQLException, Exception{
        if(alias == null) alias = "LINHA";
        Cliente c = ClienteDao.getClienteByResultSet(rs, null);
        Plano p = PlanoDao.getPlanoByResultSet(rs, null);

        Linha l = new Linha(rs.getString(alias + ".NUMERO"));
        l.setDataDeAtivacao(rs.getTimestamp(alias + ".DATA_DE_ATIVACAO"));
        if(rs.getTimestamp(alias + ".DATA_DE_CANCELAMENTO") != null)
            l.setDataDeCancelamento(rs.getTimestamp(alias + ".DATA_DE_CANCELAMENTO"));
        l.setDiaDePagamento(rs.getInt(alias + ".DIA_DE_PAGAMENTO"));
        l.setCliente(c);
        l.setPlano(p);
        
        return l;
    }

    public static ArrayList<Linha> findByCpf(String cpf) throws SQLException, Exception{
        String sql = mainSql + " WHERE CLIENTE.CPF  = '" + cpf + "'";

        Statement stmt = (Statement) DbConnection.getInstance().createStatement();
        ResultSet rs = stmt.executeQuery(sql);

        ArrayList<Linha> list = new ArrayList();
        while(rs.next()){
            list.add(getLinhaByResultSet(rs, null));
        }
        
        return list;
    }

    public static Object[][] listAsVector() throws SQLException, Exception{
        int row = 0;
        ArrayList<Linha> linhas = LinhaDao.list();
        Object[][] rows;

        if(linhas.isEmpty()){
            rows = null;
        } else {
            rows = new Object[linhas.size()][6];
        }

        for (Linha l : linhas) {
            rows[row][0] = l.getNumero();
            rows[row][1] = l.getCliente().getCpf();
            rows[row][2] = l.getPlano().getCodigo();
            rows[row][3] = l.getDataDeAtivacao();
            rows[row][4] = l.getDataDeCancelamento();
            rows[row][5] = l.getDiaDePagamento();
            row++;
        }
        return rows;
    }

    public static Object[][] findAsVector(String numero) throws SQLException, Exception{
        Linha linha = LinhaDao.find(numero);
        Object[][] rows = null;
        if(linha != null){
            rows = new Object[1][6];
            rows[0][0] = linha.getNumero();
            rows[0][1] = linha.getCliente().getCpf();
            rows[0][2] = linha.getPlano().getCodigo();
            rows[0][3] = linha.getDataDeAtivacao();
            rows[0][4] = linha.getDataDeCancelamento();
            rows[0][5] = linha.getDiaDePagamento();
        }
        return rows;
    }

}
